#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	//1.打开RCC内部时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟
//	/*引脚重映射配置*/
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//将PA0换到PA15
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//解除TAG调试端口的复用，PA15、PB3、PB4变回GPIO
	
	/*外设GPIO配置*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	//2.选择时基单元的时钟源，对于定时中断，我们就选择内部时钟源
	TIM_InternalClockConfig(TIM2);
	
	//3.配置时基单元，包括这里的预分频器、自动重装器、计数模式等等（用结构体配置）
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数（计数有向上、向下、中央对齐计数）
	/*定时时间决定于以下俩个对象*/

/*舵机要求的周期是20ms,那频率就是1/20ms=50Hz(1ms = 1kHz),将PSC设置72，ARR设置20K,对应PWM频率50Hz,周期20ms
	占空比，舵机要求高电平时间是0.5ms~2.5ms
	|  CCR设置  |  时间  |
	|    500    |  0.5ms |
	|    1000   |   1ms  |
	|    1500   |  1.5ms |
	|    2000   |   2ms  |
	|    2500   |  2.5ms |
	*/
	TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;//周期，ARR自动重装器的值  //ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//PSC预分频器的值；      //PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值，高级定时器才有，TIM2为通用定时器，故置零
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	//4.初始化输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//如果你不想把所有成员都列一遍赋值,可以给结构体赋初始值
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//设置输出比较的模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//设置输出比较的极性：High,高极性，就是极性不翻转。REF波形形直接输出
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//设置输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //加载到捕获比较寄存器中的脉冲值(高电平占空比)。       //CCR
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);//通道2初始化
	
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare2(uint16_t Compare)//这个函数是用来单独更改通道1的CCR值的
{
	TIM_SetCompare2(TIM2,Compare);
}
